/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

/*
 * 文件内容：教材中的【例3.41】, 互斥的多重入口演示.
 *
 * 原文仅给出了 C 语言块注释的处理， 这里是其扩充/修改版本：
 * (1) 可识别块注释、行注释；
 * (2) 输出注释中的文字；
 * (3) 对于注释之外的内容，统统丢弃.
 */

%{
%}

%option noyywrap

%x BLOCK_COMMENT  LINE_COMMENT

%%
"/*"                    { BEGIN(BLOCK_COMMENT);     /* 块注释开始 */
                          printf("\n--BEGIN of BLOCK-COMMENT\n");
                        }
<BLOCK_COMMENT>"*/"	    { BEGIN(0);                 /* 块注释结束 */
                          printf("\n--END of BLOCK-COMMENT\n");
                        }
<BLOCK_COMMENT>.        { ECHO; }                   /* 块注释内容 */
<BLOCK_COMMENT>\n       { ECHO; }                   /* 块注释内容 */

"//"                    { BEGIN(LINE_COMMENT);      /* 行注释开始 */
                          printf("\n--BEGIN of LINE-COMMENT\n");
                        }
<LINE_COMMENT>.         { ECHO;     }               /* 行注释内容 */
<LINE_COMMENT>\n        { BEGIN(0);                 /* 行注释结束 */
                          printf("\n--END of LINE-COMMENT\n");
                        }

\n|.       /* 这里丢弃注释之外的所有字符 */

%%

int main() {
   yylex();
   return 0;
}

/*
前面使用了 %option noyywrap，所以这个函数无需定义了
int yywrap() { return 1; }
*/
